/**服务端开发主要工作：读写数据库、提供API 
 * node.js的能力及应用
 * 1、脱离浏览器运行js
 * 2、node.js stream（前端工程化基础）
 * 3、服务端API
 * 4、中间层
 * koa 特点：极其精简，定制能力强 
 * 为了保证代码运行为洋葱模型一定需要加 async...await...
 * 使用nodemon自动重启server
 * */
const Koa = require('koa')
const app = new Koa()

const parser = require('koa-bodyparser') // 获取body参数
app.use(parser())

const Router = require('koa-router')
const router = new Router()

// const requireDirectory = require('require-directory')


const initManager = require('./core/init')
initManager.initcore(app)

const errCatch = require('./core/middlewares/exception')
app.use(errCatch)

/** koa 洋葱模式 */
// app.use(async(ctx, next) => {
//   /** ctx 表示上下文, next 表示执行下一个函数（返回promise） */
//   console.log(1)
//   await next()
//   console.log(3)
// })
// app.use(async(ctx, next) => {
//   console.log(2)
//   await next()
//   console.log(4)
// })

// app.use(async(ctx, next) => {
//   console.log(5)
//   // 直接取值还可以对表达式求值
//   const a = await next()
//   console.log(a)
//   .then(res => {
//     console.log(res) // hello
//   })
// })

// app.use((ctx, next) => {
//   console.log(6)
//   return 5*7
// })

// app.use(async(ctx, next) => {
//   await next()
//   const r = ctx.r
//   console.log(r)
// })
// app.use(async(ctx, next) => {
//   const res = await axios.get('http://7yue.pro')
//   ctx.r = res
//   await next()
// })

// ==================19.8.13==================================
/** koa路由操作
 *  ctx是和request别名等效
 */
// app.use(async(ctx, next) => {
//   console.log(ctx.path)  // 获取接口名称
//   console.log(ctx.method) // 获取http请求方法

//   if (ctx.path === 'classic/test' && ctx.method === 'GET') {
//     ctx.body = { key: 'classic' } // 通过ctx.body返回内容到客户端
//   }
// })

/** 每次判断太过于繁琐 使用第三方 koa-router */
// router.get('/classic/test', (ctx, next) => {
//   ctx.body = { key: 'classic' }
// })
// app.use(router.routes())

/** 路由主题拆分 api版本问题(业务变更) -> 版本号携带策略(url路径区分) */
// const book = require('./api/v2/book')
// const classic = require('./api/v2/classic')

// app.use(book.routes())
// app.use(classic.routes())

/** 路由自动加载(自动加载某个文件下所有的路由模块) -> 第三方require-directory */
// requireDirectory(module, './api/v2/', { visit: loadModule }) // 获取所有路由进行遍历
// function loadModule (obj) {
//   if (obj instanceof Router) {
//     app.use(obj.routes())
//   }
// }


/** nodeJS + vscode 调试
 * 1.断点调试 选中一行 按F5
 * 2.代码改动后自动重启 -> 全局安装nodemon -> 运行nodemon app.js -> 代码更新 保存 自动刷新 
 * 3.兼容上两种方式：vscode添加启动配置文件 点击小爬虫 -> launch.json文件 -> 配置启动方式*/


 /** app.js作为入口文件 代码不宜臃肿 将路由自动加载移至core->init.js
  *  koa-router 获取客户端传递的参数 -> api/v2/classic.js
 */

 /** 异常处理 -> error.js */
 
app.listen(3012)